"""服务端"""

"""jupyter notebook中，不利于实验网络编程代码，请将下面代码复制到 Pycharm 中进行展示："""

from socket import *
from threading import Thread


def recv_data():
    """接收信息"""
    
    while True:
        
        # 程序阻塞，等待接收信息
        recv_data = client_socket.recv(1024)  # 最大接收1024字节
        
        # 解码，获取信息
        recv_content = recv_data.decode("gbk")
        print(f"客户端说:{recv_content},来自:{client_info}")
        
        # 如果接收到的信息为 end，则不再接收信息
        if recv_content == "end":
            print("结束接收消息！")
            break


def send_data():
    """发送信息"""
    
    while True:
        msg = input("请输入：\n")
        
        # 发送信息
        client_socket.send(msg.encode("gbk"))
        
        # 如果发送的信息是 end, 则不再发送信息
        if msg == "end":
            print("结束发送消息！")
            break


if __name__ == '__main__':
    
    # 建立 TCP套接字
    server_socket = socket(AF_INET, SOCK_STREAM)  
    
    server_socket.bind(("127.0.0.1", # 本机IP，可不填
                        8899))  # 接收信息的端口号
    
    # 配置监听信息 -- 最多建立 5个连接
    server_socket.listen(5)
    
    # 程序阻塞，等待建立连接
    print("等待接收连接！")
    client_socket, client_info = server_socket.accept() # 获取 客户端的socket
    print("一个客户端建立连接成功！")

    # 创建两个线程 -- 一个负责发送信息，一个负责接收信息
    t1 = Thread(target=recv_data)
    t2 = Thread(target=send_data)
    
    # 启动线程
    t1.start()
    t2.start()

    # 等待子线程结束，主线程才结束
    t1.join()
    t2.join()

    # 关闭
    client_socket.close()
    server_socket.close()